Google Cloudの組織ポリシー(制約)の一覧をExcelに出力してみた #cm_google_cloud_adcal_2024
この記事はクラスメソッドの Google Cloud Advent Calendar 2024 の 4日目のブログです。
いよいよクリスマスの季節ですね!
Google Cloud Advent Calendar 2024では Google Cloud大好きなクラメソエンジニアたちが技術ブログを持ち回りで毎日絶賛執筆中です。
是非クリスマスまでお楽しみください!
さて今回は組織ポリシーの制約一覧をExcelに出力するスクリプトをご紹介します!
概要
Google Cloudの組織ポリシーの制約は以下のとおりリファレンスに一覧が記載されています。
一覧が記載されているのですが、じゃあ実際に組織を作ろう・どんな制約を適用しようか考えようという時にはExcelやスプレッドシートなどで扱いたくなる時もあるかと思います。
とはいえコピペで作るのも手間だし新しい制約が追加された場合に作り直すのも大変だなと思い、APIでうまいこと取得してExcel出力できないものかと考えました。
そして、組織ポリシーのクライアントOrgPolicyClient
を見ているといい感じのClassがあったのでこれはできるなと思いやってみました。
やりたいこと
- pythonを使って組織ポリシーの制約一覧を取得し、Excelへ出力したい
- 制約の説明は日本語に翻訳したい
やってみた
どの項目を取得するか考える
リファレンスを見ると取得できるフィールドは下記のとおりでした。
フィールド名 | 説明 |
---|---|
name | 制約のリソース名 |
display_name | 表示名 |
description | 制約の説明 |
constraint_default | 制約にポリシーが存在しない場合の評価動作 |
list_constraint | リソースのポリシーを設定するときに、特定の値のリストを基準に「許可」または「拒否」するルールを定義 |
boolean_constraint | 「有効」または「無効」にするかを制御する単純なブール値の制約を定義 |
supports_dry_run | この制約がドライラン(dry run)をサポートしているかどうか |
制約の名称や説明、ドライランができるかどうかは最低限知りたいので取得します。また、このまま取得すると全て英語でレスポンスが返ってくるので一応日本語の翻訳もつけたいと思います。
翻訳もする
翻訳はCloud Translationを用います。
今回の翻訳ではモデルの訓練などは行わずtranslate
メソッドで行います。料金表としては以下となります。
使用料 | |
---|---|
最初の 500,000 文字 *(1 か月あたり) | 無料(毎月 $10 分のクレジットとして適用) |
500,001 文字~10 億文字 *(1 か月あたり) | $20/100 万文字 |
10 億文字超*(1 か月あたり) | 割引料金についてのご相談は、営業担当者にお問い合わせください。 |
今回のスクリプトでは、1回の実行で約6万文字程度を処理します。そのため、通常は無料枠(50万文字)に収まりますが、他の用途でCloud Translation APIを使用している場合や複数回スクリプトを実行すると料金が発生する可能性があるため十分注意してください。
準備
以下のライブラリを使用しています。事前にインストールしてください。
google-cloud-orgpolicy
google-cloud-translate
pandas
openpyxl
インストールコマンドは以下
pip install google-cloud-orgpolicy google-cloud-translate pandas openpyxl
またGoogle Cloudの以下のAPIを有効化している必要があります。
OrgPolicy API
Cloud Translation API
認証に関しては、私はローカルから実行するのでGoogle Cloud SDKを使用したADCで行いました。
gcloud auth application-default login
スクリプトを説明
とりあえずスクリプト全文です。
import pandas as pd
from google.cloud import orgpolicy_v2
from google.cloud import translate_v2 as translate
def translate_text(text, target_language="ja"):
"""
Cloud Translation APIを使用してテキストを翻訳
"""
client = translate.Client()
result = client.translate(text, target_language=target_language)
return result["translatedText"]
def list_constraints_to_excel(project_id, target_language="ja", output_file="constraints.xlsx"):
"""
制約一覧をExcelファイルに出力
"""
# Create a client for OrgPolicy
client = orgpolicy_v2.OrgPolicyClient()
request = orgpolicy_v2.ListConstraintsRequest(
parent=project_id,
)
print(f"Listing constraints for: {project_id}")
response = client.list_constraints(request=request)
data = []
for constraint in response:
name = constraint.name
display_name = constraint.display_name
description = constraint.description
constraint_default = constraint.constraint_default.name
supports_dry_run = constraint.supports_dry_run
# 翻訳
translated_display_name = translate_text(display_name, target_language) if display_name else "No display name available"
translated_description = translate_text(description, target_language) if description else "No description available"
data.append({
"Name": name,
"Display Name": display_name,
"Translated Display Name": translated_display_name,
"Description": description,
"Translated Description": translated_description,
"Constraint Default": constraint_default,
"Supports Dry Run": supports_dry_run,
})
df = pd.DataFrame(data)
df.to_excel(output_file, index=False, engine="openpyxl")
print(f"Constraints exported to {output_file}")
if __name__ == "__main__":
project_id = "projects/プロジェクトID" # プロジェクトIDを指定
output_file = "constraints.xlsx" # 出力ファイル名
list_constraints_to_excel(project_id, output_file=output_file)
スクリプト全体の流れ
- Google Cloud OrgPolicy API を使用して指定したプロジェクトの制約を取得
- 制約の名前、表示名、説明、デフォルト動作、ドライランサポート情報を取得
- display_name(表示名) と description(説明) を Google Cloud Translation API を使用して翻訳
- 取得したデータをDataFrameに格納し、Excelファイルに出力
※翻訳したくない場合はtranslated_display_name
とtranslated_description
を削除してください
translate_text
関数
def translate_text(text, target_language="ja"):
client = translate.Client()
result = client.translate(text, target_language=target_language)
return result["translatedText"]
- 役割:
- Cloud Translation API を使用して、指定されたテキストを翻訳
- 引数:
text
: 翻訳するテキストtarget_language
: 翻訳先の言語コード(デフォルトで日本語"ja"
を指定)
- 戻り値:
- 翻訳されたテキスト
list_constraints_to_excel
関数
def list_constraints_to_excel(project_id, target_language="ja", output_file="constraints.xlsx"):
- 役割:
- 指定されたプロジェクトの制約を取得し、翻訳して Excel ファイルに出力
- 引数:
project_id
: プロジェクト ID を指定target_language
: 翻訳先の言語(デフォルトは日本語"ja"
)output_file
: 出力するExcelファイルのパス
制約の取得と翻訳
response = client.list_constraints(request=request)
for constraint in response:
name = constraint.name
display_name = constraint.display_name
description = constraint.description
constraint_default = constraint.constraint_default.name
supports_dry_run = constraint.supports_dry_run
translated_display_name = translate_text(display_name, target_language) if display_name else "No display name available"
translated_description = translate_text(description, target_language) if description else "No description available"
- 動作:
client.list_constraints
を使用して、指定されたプロジェクトの制約を取得- 各制約の以下の情報を取得:
name
: 制約名display_name
: 表示名description
: 制約の説明constraint_default
: 制約のデフォルト動作(ALLOW
またはDENY
)supports_dry_run
: ドライランのサポート有無
display_name
とdescription
を翻訳
データの保存
df = pd.DataFrame(data)
df.to_excel(output_file, index=False, engine="openpyxl")
- 動作:
- 取得したデータをDataFrameに格納
- DataFrameをExcel ファイル(
constraints.xlsx
)として保存
出力されるExcelファイルには以下の列名が設定されます。
列名 | 説明 |
---|---|
Name |
制約名 |
Display Name |
表示名 |
Translated Display Name |
翻訳した表示名 |
Description |
制約の説明 |
Translated Description |
翻訳した説明 |
Constraint Default |
制約のデフォルト動作(ALLOW または DENY ) |
Supports Dry Run |
ドライランのサポート有無(True または False ) |
結果を見てみる
スクリプトを実行して出力されたExcelファイルを見てみます。
とってもいい感じに出力されていました。日本語の翻訳もリファレンス記載の値と比較してみます。
リファレンス | スクリプト |
---|---|
このリスト型制約は、適用される Vertex AI Workbench のノートブックとインスタンスに対して許可されるアクセスのモードを定義します。許可リストまたは拒否リストでは、service-account モードで複数のユーザーの指定、またはsingle-user モードでシングル ユーザー アクセスの指定を行えます。許可または拒否するアクセスモードを明示的に表示する必要があります。constraints/ainotebooks.accessMode | このリスト制約は、適用される Vertex AI Workbench ノートブックおよびインスタンスに許可されるアクセス モードを定義します。許可リストまたは拒否リストでは、サービス アカウント モードで複数のユーザーを指定することも、シングル ユーザー モードで単一ユーザーのアクセスを指定することもできます。許可または拒否するアクセス モードは明示的にリストする必要があります。 |
微妙に表現が異なる箇所はありますがほぼ意味は同じと言えると思います。
全部の制約がスクリプトをたたくだけで一覧表にできるので(そんなに頻度は多くないですが)とても助かります!
所感
ということで、あんまり使う機会がない気もするスクリプトを作ってしまいました笑。スクリプトを作る過程でリファレンスをたくさん読み込んで勉強になったのでとても良かったですが。
Cloud Translationの使いやすさも感動しましたが次はGeminiに翻訳してもらうのとかもやってみたいなーなんて思います。
さてさてGoogle Cloud Advent Calendar 2024の明日 12/5 の投稿担当は村田一紘さんです!
ではでは、また明日!ナマステー
参考